package stackdriver
import (
"time"
"github.com/K-Phoen/sdk"
)
const AlignmentStackdriverAuto = "stackdriver-auto"
const AlignmentGrafanaAuto = "grafana-auto"
type PreprocessorMethod string
const PreprocessRate = "rate"
const PreprocessDelta = "delta"
type Aligner string
const AlignNone Aligner = "ALIGN_NONE"
const AlignDelta Aligner = "ALIGN_DELTA"
const AlignRate Aligner = "ALIGN_RATE"
const AlignInterpolate Aligner = "ALIGN_INTERPOLATE"
const AlignNextOlder Aligner = "ALIGN_NEXT_OLDER"
const AlignMin Aligner = "ALIGN_MIN"
const AlignMax Aligner = "ALIGN_MAX"
const AlignMean Aligner = "ALIGN_MEAN"
const AlignCount Aligner = "ALIGN_COUNT"
const AlignSum Aligner = "ALIGN_SUM"
const AlignStdDev Aligner = "ALIGN_STDDEV"
const AlignCountTrue Aligner = "ALIGN_COUNT_TRUE"
const AlignCountFalse Aligner = "ALIGN_COUNT_FALSE"
const AlignFractionTrue Aligner = "ALIGN_FRACTION_TRUE"
const AlignPercentile99 Aligner = "ALIGN_PERCENTILE_99"
const AlignPercentile95 Aligner = "ALIGN_PERCENTILE_95"
const AlignPercentile50 Aligner = "ALIGN_PERCENTILE_50"
const AlignPercentile05 Aligner = "ALIGN_PERCENTILE_05"
const AlignPercentChange Aligner = "ALIGN_PERCENT_CHANGE"
type Reducer string
const ReduceNone Reducer = "REDUCE_NONE"
const ReduceMean Reducer = "REDUCE_MEAN"
const ReduceMin Reducer = "REDUCE_MIN"
const ReduceMax Reducer = "REDUCE_MAX"
const ReduceSum Reducer = "REDUCE_SUM"
const ReduceStdDev Reducer = "REDUCE_STDDEV"
const ReduceCount Reducer = "REDUCE_COUNT"
const ReduceCountTrue Reducer = "REDUCE_COUNT_TRUE"
const ReduceCountFalse Reducer = "REDUCE_COUNT_FALSE"
const ReduceCountFractionTrue Reducer = "REDUCE_FRACTION_TRUE"
const ReducePercentile99 Reducer = "REDUCE_PERCENTILE_99"
const ReducePercentile95 Reducer = "REDUCE_PERCENTILE_95"
const ReducePercentile50 Reducer = "REDUCE_PERCENTILE_50"
const ReducePercentile05 Reducer = "REDUCE_PERCENTILE_05"
type Option func (query *Stackdriver )
type Stackdriver struct {
Builder sdk .AlertQuery
}
func Delta (ref string , metricType string , options ...Option ) *Stackdriver {
return newMetric (ref , "DELTA" , metricType , options ...)
}
func Gauge (ref string , metricType string , options ...Option ) *Stackdriver {
return newMetric (ref , "GAUGE" , metricType , options ...)
}
func Cumulative (ref string , metricType string , options ...Option ) *Stackdriver {
return newMetric (ref , "CUMULATIVE" , metricType , options ...)
}
func newMetric(ref string , metricKind string , metricType string , options ...Option ) *Stackdriver {
nope := false
stackdriver := &Stackdriver {
Builder : sdk .AlertQuery {
RefID : ref ,
QueryType : "" ,
DatasourceUID : "__FILL_ME__" ,
RelativeTimeRange : &sdk .AlertRelativeTimeRange {},
Model : sdk .AlertModel {
RefID : ref ,
Format : "time_series" ,
QueryType : "metrics" ,
Hide : &nope ,
Datasource : sdk .AlertDatasourceRef {
UID : "__FILL_ME__" ,
Type : "stackdriver" ,
},
Interval : "" ,
IntervalMs : 15000 ,
MetricQuery : &sdk .StackdriverAlertQuery {
MetricKind : metricKind ,
MetricType : metricType ,
},
},
},
}
for _ , opt := range append (defaults (), options ...) {
opt (stackdriver )
}
return stackdriver
}
func defaults() []Option {
return []Option {
TimeRange (10 *time .Minute , 0 ),
}
}
func TimeRange (from time .Duration , to time .Duration ) Option {
return func (stackdriver *Stackdriver ) {
stackdriver .Builder .RelativeTimeRange .From = int (from .Seconds ())
stackdriver .Builder .RelativeTimeRange .To = int (to .Seconds ())
}
}
func Legend (legend string ) Option {
return func (stackdriver *Stackdriver ) {
stackdriver .Builder .Model .MetricQuery .AliasBy = legend
}
}
func Project (project string ) Option {
return func (stackdriver *Stackdriver ) {
stackdriver .Builder .Model .MetricQuery .ProjectName = project
}
}
func Aggregation (reducer Reducer ) Option {
return func (stackdriver *Stackdriver ) {
stackdriver .Builder .Model .MetricQuery .CrossSeriesReducer = string (reducer )
}
}
func Alignment (aligner Aligner , alignmentPeriod string ) Option {
return func (stackdriver *Stackdriver ) {
stackdriver .Builder .Model .MetricQuery .AlignmentPeriod = alignmentPeriod
stackdriver .Builder .Model .MetricQuery .PerSeriesAligner = string (aligner )
}
}
func Preprocessor (preprocessor PreprocessorMethod ) Option {
return func (stackdriver *Stackdriver ) {
stackdriver .Builder .Model .MetricQuery .Preprocessor = string (preprocessor )
}
}
func Filter (filters ...FilterOption ) Option {
return func (stackdriver *Stackdriver ) {
for i , filterOpt := range filters {
f := &filter {}
filterOpt (f )
if i != 0 || len (stackdriver .Builder .Model .MetricQuery .Filters ) != 0 {
stackdriver .Builder .Model .MetricQuery .Filters = append (stackdriver .Builder .Model .MetricQuery .Filters , "AND" )
}
stackdriver .Builder .Model .MetricQuery .Filters = append (stackdriver .Builder .Model .MetricQuery .Filters , f .leftOperand , f .operator , f .rightOperand )
}
}
}
func GroupBys (groupBys ...string ) Option {
return func (stackdriver *Stackdriver ) {
stackdriver .Builder .Model .MetricQuery .GroupBys = groupBys
}
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .